// 接口是用来描述对象
// 接口是对类一部分行为的抽象

// 类成员：实例的属性和原型上的方法
// 接口就是为了修饰类成员的
interface ClockInterface {
    currentTime: Date;
    sayName: (a: number) => void;
}

class Clock implements ClockInterface {
    currentTime: Date;
    sayName() {

    }
    constructor(h: number, m: number) { }
}

// 继承接口
// 接口的扩展
interface Shape {
    color: string
}
interface Square extends Shape {
    sideLength: number;
}
let a: Square = {
    color: '123',
    sideLength: 123
}

// 断言，在赋值的时候，确定ts的类型
// 两种断言方式
let square = {} as Square
let square1 = <Square>{}
square.color = '123',
    square.sideLength = 123

// 多接口继承
interface Shape {
    color: string;
}

interface PenStroke {
    penWidth: number;
}

interface Square extends Shape, PenStroke {
    sideLength: number;
}

let square3 = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

// 交叉类型，两个都包括 &
// 联合类型，两者取其一 |
type ShapeAndPenStroke = Shape & PenStroke;

// 混合类型
// 一个对象可以同时作为函数和对象使用


// 接口可以当作接口
// 类可以当作接口
// 接口继承类 定义类的同时定义了接口

// 类继承类
// 类继承抽象类 抽象类不能实例，抽象类中方法和属性需要在继承的时候实现

// 类实现接口